<?php
/**
 * Article
 *
 * Обработка данных статей
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
class Article extends ActiveRecord  {
	protected $tableName = 'article';
	public $pkName = 'ID_article';
	public $essenceNumberOnPage = 1;			// Количество отображаемых статей на одной странице
	protected $arrWysiwyg = array('text');
	
	protected $arrSettings = array(
		'created_at' => true,  // в БД храним время создания
		'updated_at' => true, 	// в БД храним время редактирования
		'author' => true			// в БД храним автора (ID_user)
	);
  public $validatesLengthOf = array(
	  'article_name' => array('minimum' => 2, 'maximum' => 128, 'message' => 'название статьи  должно состоять из 2-128 символов'),
    //'article_name_en' => array('minimum' => 2, 'maximum' => 128, 'message' => 'название статьи (en) должно состоять из 2-128 символов'),
    'url' => array('minimum' => 2, 'maximum' => 128, 'message' => 'url должен состоять из 2-128 символов'),
    'title' => array('minimum' => 2, 'maximum' => 128, 'message' => 'meta-title должен состоять из 2-128 символов'),
    //'title_en' => array('minimum' => 2, 'maximum' => 128, 'message' => 'meta-title (en) должен состоять из 2-128 символов'),
    'text' => array('minimum' => 2, 'message' => 'текст статьи должен быть заполнен'),
    //'text_en' => array('minimum' => 2, 'message' => 'текст (en) должен быть заполнен'),
  );
  
  public $validatesFormatOf = array(
    'url' => array('message' => 'URL введен неверно', 'with' => '|^[\-_A-Za-z0-9\.]+$|', 'allowNull' => true)
  );
  public $validatesPresenceOf = array (
  		'article-main-picture' => 'Нужно обязательно загрузить основную фотографию'
  		);
//  public $validatesUniquenessOf = array(
  //  'url' => array('message' => 'Такой URL уже используется', 'allowOneNull' => true)
 // );
  public $validatesUniquenessOf = array(
  		'url' => array('fieldName' => 'url', 'uniqueInField' => 'ID_category')
  );
  /**
   * (non-PHPdoc)
   * @see ActiveRecord::beforeDelete()
   */
  public function beforeDelete() {
  	Service_Debug::setDebug();
    if (!$this->id) return false;
		$objDB = Service_Database::instance();
		// Системные статьи нельзя удалить
		$stmt = "SELECT `is_system` FROM `article` WHERE `ID_article` = '" . $this->id . "'";
		return !$objDB->selectSimpleField($stmt);
  }
  
  /**
   * (non-PHPdoc)
   * @see ActiveRecord::beforeValidation()
   */
  public function beforeValidation() {
  	Service_Debug::setDebug();
  	if (!empty($this->tableFields['url'])) {
  		if (in_array($this->tableFields['url'],$this->arrSystemWords)) {
  			$arrTemp = array();
  			$this->errorValidated('url', $arrTemp, 'данный URL является системным - его нельзя использовать');
  		}
  	}
  	
  	//Удаляем из сохраняемого массива поля с пустыми значениями
  	$arrCheck = $this->tableFields;
  	foreach ($arrCheck as $key => $value) {
  		if ($key == 'ID_category' && $value == '') $arrCheck[$key] = null;
  	}
  	$this->tableFields = $arrCheck;
  	
  	// Проверка основной картинки статьи
  	$fileArray = $_FILES['article-main-picture'];
  	$filename = IMAGES . 'essence/article/' . $this->id . '/main_' . $this->id . '.jpg';
  	// Если к статье нет картинки на сервере и она сейчас не загружена, записываем ошибку
  	if (empty($fileArray['name']) && !file_exists($filename)) {
  		$this->errorValidated('article-main-picture', null, 'Не загружена картинка статьи');
  	}
  }
  
  public function afterSave() { 
  	$fileArray = $_FILES['article-main-picture'];
  	if ($fileArray['name']) $this->savePicture($fileArray);
  }
  
  /**
   * Получает id статьи по её url
   *
   * @param string $articleUrl - url статьи
   */
  public static function getId($articleUrl) {
  	Service_Debug::setDebug();
  	$objDB = Service_Database::instance();
  	$stmt = "SELECT `ID_article` FROM `article` WHERE `url` = '" . Service_Escape::absolutelyEscapeString($articleUrl) . "'";
  	return $objDB->selectSimpleField($stmt);
  }
  
  /**
   * Функция увеличивает счётчик просмотров статьи на единицу
   *
   */
  public function increaseCounter() {
  	Service_Debug::setDebug();
  	$stmt = "UPDATE `article` SET `article`.`viewings`=`article`.`viewings` + 1 WHERE `article`.`ID_article`='" . $this->id . "'";
  	$objDB = Service_Database::instance();
  	$objDB->query($stmt);
  }
  
  /**
   * Функция сохраняет картинки статьи
   *
   */
  public function savePicture($fileArray) {
  	$objImage = new Service_Image(array(
  			'resizeType' => 'save_propotion',
  			'availableExtensions' => array('jpg'),
  			'throw' => true,
  			'usePrefix' => true,
  			'exception' => true
  	));
  	$objImage->setGoalFolder('essence/article/' . $this->id . '/');
  	$objImage->loadScrAsArray($fileArray);
  	$objImage->setGoalName($this->id);
  	$objImage->setArrSizes(array(
  			array('prefix' => 'main_', 'width' => 130, 'height' => 130),
  	));
  	$objImage->saveExistingFile();
  	$objImage->save();
  }
  
  /**
   * Функция получает массив пар месяц-год для архива статей
   */
  public function getArchiveList() {
  	Service_Debug::setDebug();
  	$objDB = Service_Database::instance();
  	$stmt = "SELECT DATE_FORMAT(`article`.`created_at`, '%m-%Y') as `month-year` FROM `article` GROUP BY 1 ORDER BY 1 DESC";
  	return $objDB->selectSimpleArray($stmt);
  }
  
  /**
   * Функция получает массив статей для заданной пары месяц-год
   */
  public function getMonthArchive($monthYear) {
  	Service_Debug::setDebug();
  	$articlesArray = $this->find('all', array('select' => '`article`.`ID_article`,`article`.`viewings`,`article`.`created_at`,`article`.`article_name`, `article`.`text`, `article`.`url` AS `article_url`, `category`.`url` AS `category_url`, `category`.`category_name`', 'joins' => 'LEFT JOIN `category` ON `article`.`ID_category` = `category`.`ID_category`', 'order' => '`article`.`created_at` DESC', 'conditions' => "DATE_FORMAT(`article`.`created_at`, '%m-%Y') ='" . $monthYear . "'"));
  	return $articlesArray;
  }
}
?>